package address

import (
	"errors"
	"time"

	"gitee.com/xgotool/backend-framework-template/config"
	"gitee.com/xgotool/backend-framework-template/model"
	"gitee.com/xiaoyutab/xgotool/individual/xqueue"
)

// 创建用户地址信息
//
//	mod	地址信息结构体
func Create(mod *model.Address) error {
	if mod.Uid == 0 {
		return errors.New("地址所属用户不能为空")
	}
	mod.UpdatedAt = time.Now().Unix()
	if mod.CreatedAt == 0 {
		mod.CreatedAt = time.Now().Unix()
	}
	if mod.Id > 0 {
		// 本次操作为更新操作
		old, err := Info(mod.Id)
		if err != nil {
			return err
		}
		if mod.Uid != old.Uid {
			return errors.New("地址暂不允许变更所有者")
		}
		mod.CreatedAt = old.CreatedAt
		if mod.IsDeleted == 1 {
			// 本次操作为删除操作，则不更新任何数据，仅更新is_deleted字段
			old.IsDeleted = 1
			mod = old
		}
	}
	conn, err := config.GetConnect()
	if err != nil {
		return err
	}
	if mod.IsDefault == 1 && mod.IsDeleted == 0 {
		// 如果是设为默认的话，需要将所有地址修改为非默认状态
		err = conn.Table(mod.TableName()).
			Where("uid", mod.Uid).  // 所属用户
			Where("is_deleted", 0). // 未删除
			Where("is_default", 1). // 未设置为默认
			Update("is_default", 0).
			Error
		if err != nil {
			return err
		}
	}
	is_create := false
	if mod.Id == 0 && mod.IsDeleted == 0 {
		// 是新增操作
		is_create = true
	}
	err = conn.Table(mod.TableName()).Save(mod).Error
	if is_create {
		// 新增操作，调用新增钩子
		xqueue.Set("hook.address.create", mod)
	} else if mod.IsDeleted == 0 {
		xqueue.Set("hook.address.update", mod)
	} else {
		xqueue.Set("hook.address.delete", mod)
	}
	return err
}
